package com.yanling.mybatis.binding;

import com.yanling.mybatis.session.SqlSession;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.Collection;

/**
 * @description: 代理类
 * @author: yanling
 * @time: 2021/1/1 21:41
 */
public class MapperProxy implements InvocationHandler {

	private SqlSession sqlSession;

	public MapperProxy(SqlSession sqlSession) {
		this.sqlSession = sqlSession;
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		System.out.println(method.getDeclaringClass().getName()+"."+method.getName());
		//最终还是将执行方法转给 sqlSession，因为 sqlSession 里面封装了 Executor
		//根据调用方法的类名和方法名以及参数，传给 sqlSession 对应的方法
		if(Collection.class.isAssignableFrom(method.getReturnType())){
			return sqlSession.selectList(method.getDeclaringClass().getName()+"."+method.getName(),args==null?null:args[0]);
		}else{
			return sqlSession.selectOne(method.getDeclaringClass().getName()+"."+method.getName(),args==null?null:args[0]);
		}
	}

}
